//  采用尝试学习node
const http = require('http'),
    util = require('util'),
    fs = require('fs');// file
//  自己项目包
const cf = require('./config/config.js'),
    tool = require('./module/emma.js');
const u = tool.require('url');
// 第三方npm管理项目包    
const mime = tool.local('mime');

//  开启服务器-用于多进程服务器学习-普通静态服务器
function InstallServer(port,dir){
    //  node 服务器
    var log = '地址为： “http://host/:'+port+'” 的服务器准备就绪。辐射地址：'+dir+'。';
    tool.log(tool.date()+": "+log,true);
    http.createServer(function(request, response){
        var cli = tool.client(request);
        var req = u.index(request.url);log = '（用户请求）InstallServer之：'+ cli.href;tool.log(tool.date()+": "+log);        
        //  系统常见文件|| js/css/html
        if(u.ckFile(req)){
            var file = __dirname+req;
            file = fs.existsSync(file)? file : __dirname+'/'+dir+req;
            if(fs.existsSync(file)){
                response.writeHead(200,{'Content-Type': mime.lookup(file)});
                var ctt = fs.readFileSync(file);
                response.write(ctt.toString());
                response.end();
            }else u.noneFound(response,html);
        }else{
            tip = '<p>禁止数据请求地址：'+req+'</p>';
            u.unerror(response,tip,'403');
        } 
    }).listen(port);
}
//  app框架级服务器
function appServer(){
    var app = cf.app,
        log;
    if(typeof(app) != 'object'){
        log = 'app 系统无法正常运行，请检查配置文件！'
        tool.log(tool.date()+": "+log,true);
        return false;
    }
    var port = app.port;
    var dir = app.dir,
        errlog = '';
    log = '地址为： “http://host/:'+port+'” 的-app框架处理服务器-准备就绪。辐射地址：'+dir+'。';
    tool.log(tool.date()+": "+log,true);

    http.createServer(function(request, response){
        var req = u.index(request.url,'index');
        
        var bind = u.bind(request,response);
        bind['dir'] = __dirname;
        request.bind = bind;//  动态传值
        var cli = tool.client(request);
        log = '（用户请求）app之：'+cli.href();tool.log(tool.date()+": "+log);
        //console.log(request.headers);
        //tool.fprint(cli.getIp());

        //  系统常见文件|| js/css/html-
        if(u.ckFile(req)){
            var file = __dirname+'/'+dir+req;
            fs.exists(file,(exists)=>{
                //  系统常用 web 相关文件检查
                if(exists){
                    response.writeHead(200,{'Content-Type': mime.lookup(file)});
                    var ctt = fs.readFileSync(file);
                    response.write(ctt.toString());
                    response.end();
                }else{u.noneFound(response,file);}
            });
        }else{
            var html = u.getCk(__dirname+'/'+dir+req);
            fs.exists(html,(exists)=>{
                if(exists){
                    if('Y' == app.tracker){//   用户追踪器
                        const tck = tool.require('tracker');
                        tck.main(request,cf);
                    }
                    const r = require(html);
                    //  ajax 请求
                    if(bind.__POST && bind.__POST['ajax'] && util.isFunction(r.AjaxAction)){
                        r.AjaxAction(request, response);
                        response.end();
                        return;
                    }

                    if('undefined' == typeof(r.issetHeader)){
                        if(util.isFunction(r.pageInit)) r.pageInit(request, response);// 页面初始化
                        response.writeHead(200,{'Content-Type': 'text/html'});
                    }
                    var endRes = false;
                    //  抛出异常，服务器健壮性
                    try{endRes = r.main(request, response);}
                    catch(e){response.write('<meta charset="utf-8"><h2 style="color:red;margin:0px;">ERROR: '+e.message+'<h2><p style="color:green;margin:0px;">From Node Server!<hr>'+tool.date()+'</p>');}//无法定位到错误行
                    if('N' == app.rcache){
                        //  删除-require缓存
                        delete require.cache[require.resolve(html)];
                    }
                    /*
                    //  endRes 由于回调函数的影响，可能出现 response介绍了,而回调函数还仍然在使用response对象 失败
                    if(response['redirect-url']){
                        //tool.redirect(response['redirect-url'],response);
                        response.writeHead(302,{'Location':response['redirect-url']});
                    }
                    */
                    if(!endRes) response.end();
                }else{
                    errlog = '<h4>[web相关应用请求无效]<h4>';
                    u.noneFound(response,html,errlog);
                }
            });
            
        }
    }).listen(port);
}
//  第1服务器实例-静态化处理
InstallServer(cf.port,cf.dir);

//  第2服务器实例-系统预留
if(typeof(cf.admin) == 'object'){
    var admin = cf.admin;
    admin.dir = admin.dir? admin.dir:'admin';
    InstallServer(admin.port,admin.dir);
}

//  第3服务器实例-静态化处理===实际的app项目
appServer();
console.log("Node 服务器正在运行...");